/**
 * @file SocketTimeout.h
 * @author haiming
 * @brief 套接字超时
 * 针对阻塞式套接字的超时设置，有三种方法
 * ① 系统中断，alarm函数，理论上系统中断可以应用于任何阻塞式系统调用的超时唤醒，不过这依赖于系统实现
 * ② select函数
 * ③ 套接字选项SO_RCVTIMEO, SO_SNDTIMEO
 * 且经实验观察，有超时功能的阻塞式套接字，类似于非阻塞式的套接字
 * @version 0.1
 * @date 2022-08-10
 * 
 * @copyright Copyright (c) 2022
 * 
 */
#ifndef _SOCKET_TIMEOUT_H_
#define _SOCKET_TIMEOUT_H_

#include "NetWorkProDefine.h"



int connect_timeout(int sockfd, const SA* servaddr, socklen_t servaddrlen, int nsec);

/**
 * @brief 从标准输入流读入数据并发送与接收服务端的数据
 * @note 总是要发送一次数据后才感觉服务端异常，如果服务端已经处于time_wait状态的服务端就会回rst包，接着双方就释放连接，服务端也不再保留time_wait状态
 * @param fp 
 * @param sockfd 
 * @param nsec 
 */
void echo_client_alarm(FILE* fp, int sockfd, int nsec);
int readable_timeo(int fd, int sec);
void set_recv_timeo(int* sockfd, int msec);
void updatesigaction(SIG_HANDLER);//为能中断慢系统调用而更新信号设置

#endif //_SOCKET_TIMEOUT_H_